package br.unirio.octopus.visao.acoes;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.validation.SkipValidation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import br.unirio.octopus.dominio.GrupoUsuarios;
import br.unirio.octopus.dominio.Palpite;
import br.unirio.octopus.dominio.Usuario;
import br.unirio.octopus.servicos.IServicoDePalpite;
import br.unirio.octopus.servicos.IServicoDeUsuario;
import br.unirio.octopus.util.LoggerDaAplicacao;
import br.unirio.octopus.util.ManipuladorDeHash;

@Controller
public class UsuarioAction extends AbstractAction {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4628681885787466395L;


	@Autowired
	private IServicoDeUsuario servicoDeUsuario;

	private IServicoDePalpite servicoDePalpite;
	private List<GrupoUsuarios> gruposDoUsuario;
	private List<Palpite> palpitesDoUsuario;

	private String senhaAntigaUsuario;

	private String mensagemDeSucesso;
	private String mensagemDeFalha;

	private File fotoDoUsuario;
	private String fotoDoUsuarioFileName;
	private String fotoDoUsuarioContentType;

	private Usuario usuario;
	
	private byte[] imagem;
	
	private Integer colocacaoGeralUsuario;
	
	private Integer quantidadeUsuarios;
	
	private List<GrupoUsuarios> tresGruposDoUsuario;

	private List<Palpite> tresPalpitesUsuario;
	

	@SkipValidation
	public String preparaPaginaInicialDoUsuario() {
	
			
		LoggerDaAplicacao
				.getLoggerDaAplicacao()
				.log("Entrando no metodo preparaPaginaInicialDoUsuario() da action UsuarioAction");
		usuario = servicoDeUsuario.obterUsuarioEGruposAPartirDeLogin(getLoginDoUsuarioAutenticado());
		
		tresGruposDoUsuario = new ArrayList<GrupoUsuarios>();
		Iterator<GrupoUsuarios> iterator = usuario.getGruposDoUsuario().iterator();
		tresPalpitesUsuario = servicoDeUsuario.obterTresPalpitesDoUsuario(getLoginDoUsuarioAutenticado());
		colocacaoGeralUsuario = servicoDeUsuario.obterColocacaoGeralDoUsuario(getLoginDoUsuarioAutenticado());
		quantidadeUsuarios = servicoDeUsuario.obterTotalDeUsuarios();
		while(iterator.hasNext()){
			tresGruposDoUsuario.add(iterator.next());
			if(tresGruposDoUsuario.size()==3){
				break;
			}
		}
		
		  
        
        return INPUT;
	}

	@SkipValidation
	public void exibirImagem(){
		Usuario usuario = servicoDeUsuario.obterUsuarioAPartirDeLogin(getLoginDoUsuarioAutenticado());
		HttpServletResponse response = ServletActionContext.getResponse();
        response.reset();
        response.setContentType("multipart/form-data"); 

        imagem = usuario.getFotoDoUsuario();

        OutputStream out;
		try {
			out = response.getOutputStream();
			out.write(imagem);
	        out.flush();
	        out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	@SkipValidation
	public String preparaFormularioDeCadastro() {
		usuario = new Usuario();
		return INPUT;
	}

	public String cadastrarUsuario() {

		String senhaCriptografada = ManipuladorDeHash.getManipuladorDeHash()
				.obterHash(usuario.getSenha());
		usuario.setSenha(senhaCriptografada);
		if (servicoDeUsuario
				.verificarSeExisteUsuarioComDeterminadoEmail(usuario.getEmail())) {
			mensagemDeFalha = getText("usuario.cadastrar.emailExiste");
			return preparaFormularioDeCadastro();
		}
		if (servicoDeUsuario.obterUsuarioAPartirDeLogin(usuario.getLogin()) != null) {

			mensagemDeFalha = getText("usuario.cadastrar.loginExiste");
			return preparaFormularioDeCadastro();
		}

		servicoDeUsuario.criarUsuario(usuario);
		mensagemDeSucesso = getText("usuario.cadastrar.sucesso");
		return preparaFormularioDeCadastro();
	}

	@SkipValidation
	public String editarPerfilUsuario() {

		File fileToCreate = null;
		try {

			String filePath = ServletActionContext.getRequest()
					.getServletContext().getRealPath("/");
			System.out.println("Server path:" + filePath);
			if(fotoDoUsuarioFileName!=null){
			fileToCreate = new File(filePath, fotoDoUsuarioFileName);

			FileUtils.copyFile(this.fotoDoUsuario, fileToCreate);
			}
      		Usuario novoUsuario = servicoDeUsuario
					.obterUsuarioAPartirDeLogin(getLoginDoUsuarioAutenticado());
			

			if (!novoUsuario.getEmail().equals(usuario.getEmail())) {
				if (servicoDeUsuario
						.verificarSeExisteUsuarioComDeterminadoEmail(usuario
								.getEmail())) {
					mensagemDeFalha = getText("usuario.cadastrar.emailExiste");
					return preparaPaginaDeEdicaoDePerfil();
				}
			}

			if(fileToCreate!=null){
			novoUsuario.setFotoDoUsuario(Files.readAllBytes(fileToCreate
					.toPath()));
			}
			novoUsuario.setEmail(usuario.getEmail());
			novoUsuario.setNome(usuario.getNome());
			novoUsuario.setCidade(usuario.getCidade());

			servicoDeUsuario.alterarUsuario(novoUsuario);

			mensagemDeSucesso = getText("usuario.editar.sucesso");

			return preparaPaginaDeEdicaoDePerfil();

		} catch (Exception e) {
			e.printStackTrace();
			addActionError(e.getMessage());
			return preparaPaginaDeEdicaoDePerfil();
		}
	}

	@SkipValidation
	public String preparaFormularioDeRecuperacaoDeSenha() {
		usuario = new Usuario();
		return INPUT;
	}

	@SkipValidation
	public String preparaPaginaDeRecuperacaoDeSenha() {
		usuario = new Usuario();
		return INPUT;
	}

	@SkipValidation
	public String preparaPaginaDeEdicaoDePerfil() {
		usuario = servicoDeUsuario
				.obterUsuarioAPartirDeLogin(getLoginDoUsuarioAutenticado());
		return INPUT;
	}

	@SkipValidation
	public String preparaPaginaDeAlteracaoDeSenha() {
		usuario = servicoDeUsuario
				.obterUsuarioAPartirDeLogin(getLoginDoUsuarioAutenticado());

		return INPUT;
	}

	@SkipValidation
	public String alterarSenhaDoUsuario() {

		Usuario novoUsuario = servicoDeUsuario
				.obterUsuarioAPartirDeLogin(getLoginDoUsuarioAutenticado());
		if (!ManipuladorDeHash.getManipuladorDeHash().verificarIgualdade(
				senhaAntigaUsuario, novoUsuario.getSenha())) {
			mensagemDeFalha = getText("usuario.cadastrar.senhaInvalida");
			return preparaPaginaDeAlteracaoDeSenha();
		} else {
			novoUsuario.setSenha(ManipuladorDeHash.getManipuladorDeHash()
					.obterHash(usuario.getSenha()));
			servicoDeUsuario.alterarUsuario(novoUsuario);
			mensagemDeSucesso = getText("usuario.editar.senhaSucesso");
		}
		return INPUT;
	}

	 
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public String getMensagemDeSucesso() {
		return mensagemDeSucesso;
	}

	public void setMensagemDeSucesso(String mensagemDeSucesso) {
		this.mensagemDeSucesso = mensagemDeSucesso;
	}

	public String getMensagemDeFalha() {
		return mensagemDeFalha;
	}

	public void setMensagemDeFalha(String mensagemDeFalha) {
		this.mensagemDeFalha = mensagemDeFalha;
	}

	public File getFotoDoUsuario() {
		return fotoDoUsuario;
	}

	public void setFotoDoUsuario(File fotoDoUsuario) {
		this.fotoDoUsuario = fotoDoUsuario;
	}

	public String getFotoDoUsuarioFileName() {
		return fotoDoUsuarioFileName;
	}

	public void setFotoDoUsuarioFileName(String fotoDoUsuarioFileName) {
		this.fotoDoUsuarioFileName = fotoDoUsuarioFileName;
	}

	public String getSenhaAntigaUsuario() {
		return senhaAntigaUsuario;
	}

	public void setSenhaAntigaUsuario(String senhaAntigaUsuario) {
		this.senhaAntigaUsuario = senhaAntigaUsuario;
	}

	public byte[] getImagem() {
		return imagem;
	}

	public void setImagem(byte[] imagem) {
		this.imagem = imagem;
	}

	public List<GrupoUsuarios> getTresGruposDoUsuario() {
		return tresGruposDoUsuario;
	}

	public void setTresGruposDoUsuario(List<GrupoUsuarios> tresGruposDoUsuario) {
		this.tresGruposDoUsuario = tresGruposDoUsuario;
	}

	public Integer getColocacaoGeralUsuario() {
		return colocacaoGeralUsuario;
	}

	public void setColocacaoGeralUsuario(Integer colocacaoGeralUsuario) {
		this.colocacaoGeralUsuario = colocacaoGeralUsuario;
	}

	public Integer getQuantidadeUsuarios() {
		return quantidadeUsuarios;
	}

	public List<Palpite> getTresPalpitesUsuario() {
		return tresPalpitesUsuario;
	}

	public void setTresPalpitesUsuario(List<Palpite> tresPalpitesUsuario) {
		this.tresPalpitesUsuario = tresPalpitesUsuario;
	}

	public void setQuantidadeUsuarios(Integer quantidadeUsuarios) {
		this.quantidadeUsuarios = quantidadeUsuarios;
	}

}
